The present invention relates generally to the compilation of software, and more specifically to register allocation for processors that support predication.
Modem processors that support predication guard the execution of instructions using predicates. A predicate is a value in a register, typically a single bit, that if set, allows instructions to be executed, and if clear, does not allow an instruction to execute. Predicates are set by predicate generating instructions that affect the instruction flow of the software program executing on the processor.
Predicate generating instructions are placed in the program in or before blocks that affect the control flow. For example, when a first block branches to a second block, and the second block is guarded by a predicate, the first block typically sets the predicate prior to the branch.
When multiple blocks follow a block that changes the control flow, multiple predicates are typically set prior to the branch, one predicate for each block in the future control flow. Oftentimes the multiple predicates are set based on the same condition, and the predicate generating instructions are redundant. Park and Schlansker present an algorithm to generate predicate generating instructions for predicated code. See J. C. H. Park and M. S. Schlansker, xe2x80x9cOn Predicated Execution,xe2x80x9d Tech. Rep. HPL-91-58, HP Laboratories, Palo Alto, Calif., May 1991.
During compilation, a virtual name for a predicate is associated with each block in a control flow graph (CFG). During register allocation, the virtual names for the predicates are mapped to the physical registers in the processor. The number of physical registers is typically much smaller than the number of virtual predicate names. Allocating registers to predicates can be a difficult problem. A discussion of mapping predicates to registers can be found in: David M. Gillies, Dz-ching Roy Ju, Richard Johnson and Michael Schlansker, xe2x80x9cGlobal Predicate Analysis and its Application to Register Allocation,xe2x80x9d Proceedings of the 29th Annual International Symposium on Microarchitecture (MICRO), December 1996.
As described above, typical algorithms for compilation create redundant predicate generating instructions. Also, typical algorithms for register allocation map multiple virtual predicates corresponding to redundant predicate generating instructions to different physical registers, which are part of a finite resource. For the reasons stated above, and for other reasons stated below which will become apparent to those skilled in the art upon reading and understanding the present specification, there is a need in the art for an alternate method and apparatus for reducing the number of predicate generating instructions in software.